package Intermediate_algorithm.SortAndSearch;

import org.junit.Test;

/*
颜色分类
给定一个包含红色、白色和蓝色、共n 个元素的数组nums，原地对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。
我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1：
输入：nums = [2,0,2,1,1,0]
输出：[0,0,1,1,2,2]
示例 2：
输入：nums = [2,0,1]
输出：[0,1,2]

作者：LeetCode
链接：https://leetcode.cn/leetbook/read/all-about-array/x9wv2h/
 */
public class _01颜色分类 {

    @Test
    public void test() {
        int[] nums = {2,0,2,1,1,0};
        sortColors(nums);
        for (int num : nums) {
            System.out.println(num);
        }
    }

    public void sortColors(int[] nums) {
        int n = nums.length;
        int red = 0,blue = n - 1;
        int temp = 0;
        for (int i = 0; i <= blue; i++) {
            if (nums[i] == 0){
                temp = nums[i];
                nums[i] = nums[red];
                nums[red] = temp;
                red++;
            }else if (nums[i] == 2){
                temp = nums[i];
                nums[i] = nums[blue];
                nums[blue] = temp;
                blue--;
                i--;
            }
        }
    }

    //官解：方法三：双指针
    /*
    作者：力扣官方题解
    链接：https://leetcode.cn/problems/sort-colors/solutions/437968/yan-se-fen-lei-by-leetcode-solution/
     */
    class Solution {
        public void sortColors(int[] nums) {
            int n = nums.length;
            int p0 = 0, p2 = n - 1;
            for (int i = 0; i <= p2; ++i) {
                while (i <= p2 && nums[i] == 2) {
                    int temp = nums[i];
                    nums[i] = nums[p2];
                    nums[p2] = temp;
                    --p2;
                }
                if (nums[i] == 0) {
                    int temp = nums[i];
                    nums[i] = nums[p0];
                    nums[p0] = temp;
                    ++p0;
                }
            }
        }
    }

}
